// 给出两个 非空 的链表用来表示两个非负的整数。其中，它们各自的位数是按照 逆序 的方式存储的，并且它们的每个节点只能存储 一位 数字。

// 如果，我们将这两个数相加起来，则会返回一个新的链表来表示它们的和。

// 您可以假设除了数字 0 之外，这两个数都不会以 0 开头。

// 示例：

// 输入：(2 -> 4 -> 3) + (5 -> 6 -> 4)
// 输出：7 -> 0 -> 8
// 原因：342 + 465 = 807

// Definition for singly-linked list.
struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(nullptr) {}
};

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode *dummy = new ListNode{-1};
        ListNode *cur = dummy;
        int carry{0}; // 进位
        while (l1 || l2) {
            int n1 = l1 ? l1->val : 0;
            int n2 = l2 ? l2->val : 0;
            int sum = n1 + n2 + carry;
            carry = sum /10;
            cur->next = new ListNode{sum % 10};
            cur = cur->next;
            if (l1) l1 = l1->next;
            if (l2) l2 = l2->next;
        }
        if (carry) cur->next = new ListNode{carry};
        return dummy->next;
    }
};

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode* dummy = new ListNode(-1);
        ListNode* pre = dummy;
        int carry{0}; // 进位
        ListNode* node1{l1};
        ListNode* node2{l2};
        while (node1 || node2) {
            int a = (node1 ? node1->val : 0);
            int b = (node2 ? node2->val : 0);
            int sum = a + b + carry;
            carry = sum / 10;
            pre->next = new ListNode(sum % 10);
            pre = pre->next;
            if (node1) node1 = node1->next;
            if (node2) node2 = node2->next;
        }
        if (carry == 1) {
            pre->next = new ListNode(carry);
        } 
        return dummy->next;
    }
};